﻿using System;
using System.Data;
using System.Data.SqlClient;

namespace Datos
{
    public class DatosSqlClient : Datos
    {
        private static DatosSqlClient _db;

        public override string ConnectionString { get; set; }

        // Constructor es 'protected' para utilizar el patron singleton
        protected DatosSqlClient()
        {
        }

        public static DatosSqlClient DB()
        {
            if (_db == null) _db = new DatosSqlClient();
            return _db;
        }

        protected override IDbConnection CrearConnection()
        {
            return new SqlConnection(ConnectionString);
        }

        protected override void CargarParametros(object[] parametros, IDbCommand command)
        {
            for (int i = 0; i < parametros.Length; i++)
            {
                SetearParametro(parametros[i], command);
            }
        }

        protected void SetearParametro(object parametro, IDbCommand command)
        {
            SqlParameter parametroSeteado;
            switch (parametro.GetType().Name)
            {
                case "DateTime": parametroSeteado = ((SqlCommand)_command).Parameters.Add("", SqlDbType.DateTime); break;
                case "Boolean": parametroSeteado = ((SqlCommand)_command).Parameters.Add("", SqlDbType.Bit); break;
                case "Int32": parametroSeteado = ((SqlCommand)_command).Parameters.Add("", SqlDbType.Int); break;
                case "String": parametroSeteado = ((SqlCommand)_command).Parameters.Add("", SqlDbType.VarChar); break;
                case "Decimal": parametroSeteado = ((SqlCommand)_command).Parameters.Add("", SqlDbType.Decimal); break;
                default: parametroSeteado = ((SqlCommand)_command).Parameters.AddWithValue("", parametro == null ? DBNull.Value : parametro); break;
            }
            parametroSeteado.Value = parametro;
            //return parametroSeteado;
        }
    }
}
